package org.jim.common.http;

/**
 * @author wchao
 */
public interface HttpConst {

    /**
     * 请求体的格式
     *
     * @author wchao
     * 2017年6月28日 上午10:03:12
     */
    public enum RequestBodyFormat {
        URLENCODED, MULTIPART, TEXT
    }

    /**
     * Accept-Language : zh-CN,zh;q=0.8
     * Sec-WebSocket-Version : 13
     * Sec-WebSocket-Extensions : permessage-deflate; client_max_window_bits
     * Upgrade : websocket
     * Host : t-io.org:9321
     * Accept-Encoding : gzip, deflate, sdch
     * User-Agent : Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
     * Origin : http://www.t-io.org:9292
     * Sec-WebSocket-Key : kmCL2C7q9vtNSMyHpft7lw==
     * Connection : Upgrade
     * Cache-Control : no-cache
     * Pragma : no-cache
     *
     * @author wchao
     * 2017年5月27日 下午2:11:57
     */
    public interface RequestHeaderKey {
        String Cookie = "Cookie".toLowerCase();//Cookie: $Version=1; Skin=new;
        String Origin = "Origin".toLowerCase(); //http://127.0.0.1
        String Sec_WebSocket_Key = "Sec-WebSocket-Key".toLowerCase(); //2GFwqJ1Z37glm62YKKLUeA==
        String Cache_Control = "Cache-Control".toLowerCase(); //no-cache
        String Connection = "Connection".toLowerCase(); //Upgrade,  keep-alive
        String User_Agent = "User-Agent".toLowerCase(); //Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3088.3 Safari/537.36
        String Sec_WebSocket_Version = "Sec-WebSocket-Version".toLowerCase(); //13
        String Host = "Host".toLowerCase(); //127.0.0.1:9321
        String Pragma = "Pragma".toLowerCase(); //no-cache
        String Accept_Encoding = "Accept-Encoding".toLowerCase(); //gzip, deflate, br
        String Accept_Language = "Accept-Language".toLowerCase(); //zh-CN,zh;q=0.8,en;q=0.6
        String Upgrade = "Upgrade".toLowerCase(); //websocket
        String Sec_WebSocket_Extensions = "Sec-WebSocket-Extensions".toLowerCase(); //permessage-deflate; client_max_window_bits
        String Content_Length = "Content-Length".toLowerCase(); //65
        String Content_Type = "Content-Type".toLowerCase();// : 【application/x-www-form-urlencoded】【application/x-www-form-urlencoded; charset=UTF-8】【multipart/form-data; boundary=----WebKitFormBoundaryuwYcfA2AIgxqIxA0 】
        String If_Modified_Since = "If-Modified-Since".toLowerCase(); //与Last-Modified配合

        /**
         * 值为XMLHttpRequest则为Ajax
         */
        String X_Requested_With = "X-Requested-With".toLowerCase();//XMLHttpRequest
    }

    //	Content-Type: text/html;charset:utf-8;

    /**
     * @author wchao
     * 2017年6月27日 下午8:23:58
     */
    public interface RequestHeaderValue {
        public interface Connection {
            String keep_alive = "keep-alive".toLowerCase();
            String Upgrade = "Upgrade".toLowerCase();
            String close = "close".toLowerCase();
        }

        //application/x-www-form-urlencoded、multipart/form-data、text/plain
        public interface Content_Type {
            /**
             * 普通文本，一般会是json或是xml
             */
            String text_plain = "text/plain".toLowerCase();
            /**
             * 文件上传
             */
            String multipart_form_data = "multipart/form-data".toLowerCase();
            /**
             * 普通的key-value
             */
            String application_x_www_form_urlencoded = "application/x-www-form-urlencoded".toLowerCase();
        }
    }

    public interface ResponseHeaderKey {
        //Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
        String Set_Cookie = "Set-Cookie".toLowerCase(); //Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
        String Content_Length = "Content-Length".toLowerCase(); //65

        String Connection = "Connection".toLowerCase(); //Upgrade,  keep-alive
        String Keep_Alive = "Keep-Alive".toLowerCase(); //Keep-Alive:timeout=20
        String Sec_WebSocket_Accept = "Sec-WebSocket-Accept".toLowerCase();
        String Upgrade = "Upgrade".toLowerCase();

        /**
         * Content-Disposition: attachment;filename=FileName.txt
         * 文件下载
         */
        String Content_disposition = "Content-disposition".toLowerCase();
        /**
         * 文档的编码（Encode）方法。只有在解码之后才可以得到Content-Type头指定的内容类型。
         * 利用gzip压缩文档能够显著地减少HTML文档的下载时间。
         * Java的GZIPOutputStream可以很方便地进行gzip压缩，但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。
         * 因此，Servlet应该通过查看Accept-Encoding头（即request.getHeader("Accept-Encoding")）检查浏览器是否支持gzip，
         * 为支持gzip的浏览器返回经gzip压缩的HTML页面，为其他浏览器返回普通页面。
         */
        String Content_Encoding = "Content-Encoding".toLowerCase();
        /**
         * 表示后面的文档属于什么MIME类型。Servlet默认为text/plain，但通常需要显式地指定为text/html。
         * 由于经常要设置Content-Type，因此HttpServletResponse提供了一个专用的方法setContentType。
         */
        String Content_Type = "Content-Type".toLowerCase();
        /**
         * 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
         */
        String Date = "Date".toLowerCase();
        /**
         * 应该在什么时候认为文档已经过期，从而不再缓存它？
         */
        String Expires = "Expires".toLowerCase();
        /**
         * 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期，该请求将被视为一个条件GET，
         * 只有改动时间迟于指定时间的文档才会返回，否则返回一个304（Not Modified）状态。Last-Modified也可用setDateHeader方法来设置。
         */
        String Last_Modified = "Last-Modified".toLowerCase();
        /**
         * 表示客户应当到哪里去提取文档。Location通常不是直接设置的，而是通过HttpServletResponse的sendRedirect方法，该方法同时设置状态代码为302。
         */
        String Location = "Location".toLowerCase();
        /**
         * 表示浏览器应该在多少时间之后刷新文档，以秒计。除了刷新当前文档之外，你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。
         * 注意这种功能通常是通过设置HTML页面HEAD区的＜META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path"＞实现，这是因为，自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是，对于Servlet来说，直接设置Refresh头更加方便。
         * <p>
         * 注意Refresh的意义是"N秒之后刷新本页面或访问指定页面"，而不是"每隔N秒刷新本页面或访问指定页面"。因此，连续刷新要求每次都发送一个Refresh头，而发送204状态代码则可以阻止浏览器继续刷新，不管是使用Refresh头还是＜META HTTP-EQUIV="Refresh" ...＞。
         * <p>
         * 注意Refresh头不属于HTTP 1.1正式规范的一部分，而是一个扩展，但Netscape和IE都支持它。
         */
        String Refresh = "Refresh".toLowerCase();
        /**
         * 服务器名字。Servlet一般不设置这个值，而是由Web服务器自己设置。
         */
        String Server = "Server".toLowerCase();

        /**
         *
         */
        String Access_Control_Allow_Origin = "Access-Control-Allow-Origin".toLowerCase(); //value: *

        /**
         *
         */
        String Access_Control_Allow_Headers = "Access-Control-Allow-Headers".toLowerCase(); //value: x-requested-with,content-type

        /**
         * 是否是从缓存中获取的数据，tio-httpserver特有的头部信息
         */
        String tio_from_cache = "tio-from-cache";
    }

    /**
     * @author wchao
     * 2017年6月27日 下午8:24:02
     */
    public interface ResponseHeaderValue {
        public interface Connection {
            String keep_alive = "keep-alive".toLowerCase();
            String Upgrade = "Upgrade".toLowerCase();
            String close = "close".toLowerCase();
        }
    }

    /**
     *
     */
    String SERVER_INFO = "tio-httpserver/0.0.1";

    /**
     * 默认规定连接到本服务器的客户端统一用utf-8
     */
    String CHARSET_NAME = "utf-8";
}
